package com.ruoyi.business.utils;

import cn.hutool.core.comparator.CompareUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Tellsea
 * @date 2024/2/4
 */
@Slf4j
public class BusinessUtils {

    /**
     * 判断成绩是否在之外：value < 0 || value > 规定值
     *
     * @param value1
     * @param value2
     * @return
     */
    public static boolean checkScore(BigDecimal value1, BigDecimal value2) {
        return CompareUtil.compare(value1, BigDecimal.ZERO) < 0 || CompareUtil.compare(value1, value2) > 0;
    }

    /**
     * 给实体类赋值空、或者 ''
     *
     * @param obj
     */
    public static void handleNullProperties(Object obj) {
        if (obj == null) {
            return;
        }
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                if (field.getType() == Long.class || field.getType() == Integer.class) {
                    if (field.get(obj) == null) {
                        field.set(obj, 0L);
                    }
                } else if (field.getType() == String.class) {
                    if (field.get(obj) == null) {
                        field.set(obj, " ");
                    }
                } else if (field.getType() == Date.class) {
                    if (field.get(obj) == null) {
                        field.set(obj, new Date());
                    }
                }
            } catch (IllegalAccessException e) {
                log.info("设置空属性异常");
                e.printStackTrace();
                throw new ServiceException("设置空属性异常");
            }
        }
    }

    /**
     * 验证字符串是否符合 "YYYY-MM-YYYY-MM" 的格式
     *
     * @param str 待验证的字符串
     * @return 如果符合返回true，否则返回false
     */
    public static boolean validateDurationDateFormat(String str) {
        // 定义正则表达式
        String regex = "^\\d{4}-\\d{2}-\\d{4}-\\d{2}$";
        // 创建Pattern对象
        Pattern pattern = Pattern.compile(regex);
        // 创建Matcher对象
        Matcher matcher = pattern.matcher(str);
        // 检查是否匹配
        return matcher.matches();
    }

    public static boolean areAllFieldsNotNull(Object obj) {
        if (obj == null) {
            return false; // 如果对象本身就是null，则直接返回false
        }
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields(); // 获取所有字段，包括私有字段
        for (Field field : fields) {
            field.setAccessible(true); // 设置私有字段可访问（如果有需要）
            try {
                if (field.get(obj) == null) { // 检查字段值是否为null
                    return false; // 如果发现任何字段为null，则返回false
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace(); // 处理可能的异常，例如私有字段访问问题等。
                return false; // 或者根据实际情况决定如何处理异常。
            }
        }
        return true; // 所有字段都不为null时返回true。
    }

    public static boolean areAnyFieldsNotFinish(Object obj, List<String> checkList) {
        if (obj == null) {
            return true;
        }
        JSONObject om = (JSONObject) JSON.toJSON(obj);
        for (String key : checkList) {
           if(om.get(key)==null){
               return true;
           }
        }
        return false;
    }

}
